package com.canaan.business.service.inOutStock;

import com.canaan.business.domain.inOutStock.PickerTaskOrder;
import com.canaan.business.domain.inOutStock.WmsPickingRecord;
import com.canaan.business.domain.inOutStock.WmsStockOccupy;
import com.canaan.business.domain.storehouse.StockCheck;
import com.canaan.business.domain.storehouse.WmsStorehouseStock;

import java.util.List;

/**
 * 库存占用Service接口
 *
 * @author ruoyi
 * @date 2023-02-07
 */
public interface IWmsStockOccupyService {
    /**
     * 查询库存占用
     *
     * @param id 库存占用主键
     * @return 库存占用
     */
    WmsStockOccupy selectWmsStockOccupyById(Long id);

    /**
     * 查询库存占用列表
     *
     * @param stockOccupy 库存占用
     * @return 库存占用集合
     */
    List<WmsStockOccupy> selectWmsStockOccupyList(WmsStockOccupy stockOccupy);

    /**
     * 新增库存占用
     *
     * @param stockOccupy 库存占用
     * @return 结果
     */
    int insertWmsStockOccupy(WmsStockOccupy stockOccupy);

    /**
     * 批量新增库存占用
     *
     * @param stockOccupyList 库存占用列表
     * @return 结果
     */
    int batchInsertWmsStockOccupy(List<WmsStockOccupy> stockOccupyList);

    /**
     * 修改库存占用
     *
     * @param stockOccupy 库存占用
     * @return 结果
     */
    int updateWmsStockOccupy(WmsStockOccupy stockOccupy);

    /**
     * 批量修改库存占用
     *
     * @param stockOccupyList 库存占用列表
     * @return 结果
     */
    int batchUpdateWmsStockOccupy(List<WmsStockOccupy> stockOccupyList);

    /**
     * 批量删除库存占用
     *
     * @param ids 需要删除的库存占用主键集合
     * @return 结果
     */
    int deleteWmsStockOccupyByIds(Long[] ids);

    /**
     * 删除库存占用信息
     *
     * @param id 库存占用主键
     * @return 结果
     */
    int deleteWmsStockOccupyById(Long id);

    /**
     * 查询库存占用
     *
     * @param no 编号
     * @return 库存占用
     */
    WmsStockOccupy selectWmsStockOccupyByNo(String no);

    /**
     * 批量删除库存占用
     *
     * @param nos 需要删除的编号集合
     * @return 结果
     */
    int deleteWmsStockOccupyByNos(String[] nos);

    /**
     * 删除库存占用信息
     *
     * @param no 编号
     * @return 结果
     */
    int deleteWmsStockOccupyByNo(String no);

    /**
     * 占用取消
     *
     * @param taskNo 任务编号
     * @return 结果
     */
    int stockOccupyCancel(String taskNo);

    /**
     * 库存占用处理
     * @param taskNo          任务编号
     * @param storehouseNo    仓库
     * @param productNo       物料编号
     * @param occupyQty       占用数量
     * @param workNo          工单编号
     * @param areaNo          库区编号
     * @return  结果
     */
    Boolean stockOccupy(String taskNo, String storehouseNo, String productNo, Long occupyQty,String workNo,String areaNo,String whetherMp);

    /**
     * 库存占用解锁
     * @param taskOrder 拣货任务单
     * @param records   拣货记录列表
     * @param businessNo 出入库单号
     * @return
     */
    int stockOccupyUnlock(PickerTaskOrder taskOrder, List<WmsPickingRecord> records,String businessNo);

    void createLock(StockCheck stockCheck, List<WmsStorehouseStock> wmsStorehouseStocks);

    void unLock(StockCheck stockCheck);
}
